--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNS/Utilities/rnprobe.py b6bfd1655cbcda3c3da5389f0ed2a7b9f7db959b (b6bfd165) Text, 9.77 KB
T8b949e#!/usr/bin/env python3
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72import T7ee787RNS
Tff7b72import T7ee787os
Tff7b72import T7ee787sys
Tff7b72import T7ee787time
Tff7b72import T7ee787argparse
Tff7b72from T7ee787RNST7ee787.T7ee787_version Tff7b72import Te6edf3__version__
Te6edf3DEFAULT_PROBE_SIZE Tff7b72= T79c0ff16
Te6edf3DEFAULT_TIMEOUT Tff7b72= T79c0ff12
Tff7b72def Td2a8ffprogram_setupTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3destination_hexhashTb4b4b4, Te6edf3sizeTff7b72=Tff7b72NoneTb4b4b4, Te6edf3full_name Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3verbosity Tff7b72= T79c0ff0Tb4b4b4, Te6edf3timeoutTff7b72=Tff7b72NoneTb4b4b4, Te6edf3waitTff7b72=T79c0ff0Tb4b4b4, Te6edf3probesTff7b72=T79c0ff1Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3size Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3size Tff7b72= Te6edf3DEFAULT_PROBE_SIZE
Tff7b72if Te6edf3full_name Tff7b72== Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe full destination name including application name aspects must be specified for the destinationTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3app_nameTb4b4b4, Te6edf3aspects Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffapp_and_aspects_from_nameTb4b4b4(Te6edf3full_nameTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3verbosity Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3more_output Tff7b72= Tff7b72True
Te6edf3verbosity Tff7b72-Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4:
Te6edf3more_output Tff7b72= Tff7b72False
Te6edf3verbosity Tff7b72-Tff7b72= T79c0ff1
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3configdirTb4b4b4, Te6edf3loglevel Tff7b72= T79c0ff3Tff7b72+Te6edf3verbosityTb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff requested Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3_timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Tb4b4b4(Te6edf3timeout Tff7b72or Te6edf3DEFAULT_TIMEOUTTff7b72+Te6edf3reticulumTff7b72.Td2a8ffget_first_hop_timeoutTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Te6edf3i Tff7b72= T79c0ff0
Te6edf3syms Tff7b72= Ta5d6ff"Ta5d6ff⢄⢂⢁⡁⡈⡐⡠Ta5d6ff"
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72and Tff7b72not Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3_timeoutTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3_timeoutTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffPath request timed outTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3server_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3request_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Te6edf3server_identityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Te6edf3app_nameTb4b4b4,
Tff7b72*Te6edf3aspects
Tb4b4b4)
Te6edf3sent Tff7b72= T79c0ff0
Te6edf3replies Tff7b72= T79c0ff0
Tff7b72while Te6edf3probesTb4b4b4:
Tff7b72if Te6edf3sent Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3waitTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3probe Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3request_destinationTb4b4b4, Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4)
Te6edf3probeTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffError: Probe packet size of Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3probeTff7b72.Td2a8ffrawTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytes exceed MTU of Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTUTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff3Tb4b4b4)
Te6edf3receipt Tff7b72= Te6edf3probeTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Te6edf3sent Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3more_outputTb4b4b4:
Te6edf3nhd Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_next_hopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3via_str Tff7b72= Ta5d6ff"Ta5d6ff via Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3nhdTb4b4b4) Tff7b72if Te6edf3nhd Tff7b72!= Tff7b72None Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3if_str Tff7b72= Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3reticulumTff7b72.Td2a8ffget_next_hop_if_nameTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4) Tff7b72if Te6edf3reticulumTff7b72.Td2a8ffget_next_hop_if_nameTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72!= Ta5d6ff"Ta5d6ffNoneTa5d6ff" Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3more Tff7b72= Te6edf3via_strTff7b72+Te6edf3if_str
Tff7b72elseTb4b4b4:
Te6edf3more Tff7b72= Ta5d6ff"Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ffSent probe Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3sentTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff (Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3sizeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytes) to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Te6edf3moreTff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3_timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Tb4b4b4(Te6edf3timeout Tff7b72or Te6edf3DEFAULT_TIMEOUTTff7b72+Te6edf3reticulumTff7b72.Td2a8ffget_first_hop_timeoutTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Te6edf3i Tff7b72= T79c0ff0
Tff7b72while Te6edf3receiptTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketReceiptTff7b72.Td2a8ffSENT Tff7b72and Tff7b72not Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3_timeoutTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3_timeoutTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffProbe timed outTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3receiptTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketReceiptTff7b72.Td2a8ffDELIVEREDTb4b4b4:
Te6edf3replies Tff7b72+Tff7b72= T79c0ff1
Te6edf3hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhops_toTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3hops Tff7b72!= T79c0ff1Tb4b4b4:
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3rtt Tff7b72= Te6edf3receiptTff7b72.Td2a8ffget_rttTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3rtt Tff7b72>Tff7b72= T79c0ff1Tb4b4b4)Tb4b4b4:
Te6edf3rtt Tff7b72= Tffa657roundTb4b4b4(Te6edf3rttTb4b4b4, T79c0ff3Tb4b4b4)
Te6edf3rttstring Tff7b72= Tffa657strTb4b4b4(Te6edf3rttTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff secondsTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3rtt Tff7b72= Tffa657roundTb4b4b4(Te6edf3rttTff7b72*T79c0ff1000Tb4b4b4, T79c0ff3Tb4b4b4)
Te6edf3rttstring Tff7b72= Tffa657strTb4b4b4(Te6edf3rttTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff millisecondsTa5d6ff"
Te6edf3reception_stats Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3reticulumTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3reception_rssi Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_packet_rssiTb4b4b4(Te6edf3receiptTff7b72.Td2a8ffproof_packetTff7b72.Td2a8ffpacket_hashTb4b4b4)
Te6edf3reception_snr Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_packet_snrTb4b4b4(Te6edf3receiptTff7b72.Td2a8ffproof_packetTff7b72.Td2a8ffpacket_hashTb4b4b4)
Te6edf3reception_q Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_packet_qTb4b4b4(Te6edf3receiptTff7b72.Td2a8ffproof_packetTff7b72.Td2a8ffpacket_hashTb4b4b4)
Tff7b72if Te6edf3reception_rssi Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3reception_stats Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff [RSSI Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3reception_rssiTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff dBm]Ta5d6ff"
Tff7b72if Te6edf3reception_snr Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3reception_stats Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff [SNR Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3reception_snrTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff dB]Ta5d6ff"
Tff7b72if Te6edf3reception_q Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3reception_stats Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff [Link Quality Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3reception_qTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff]Ta5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3receiptTff7b72.Td2a8ffproof_packet Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3receiptTff7b72.Td2a8ffproof_packetTff7b72.Td2a8ffrssi Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3reception_stats Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff [RSSI Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3receiptTff7b72.Td2a8ffproof_packetTff7b72.Td2a8ffrssiTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff dBm]Ta5d6ff"
Tff7b72if Te6edf3receiptTff7b72.Td2a8ffproof_packetTff7b72.Td2a8ffsnr Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3reception_stats Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff [SNR Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3receiptTff7b72.Td2a8ffproof_packetTff7b72.Td2a8ffsnrTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff dB]Ta5d6ff"
Tffa657printTb4b4b4(
Ta5d6ff"Ta5d6ffValid reply from Ta5d6ff"Tff7b72+
Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3receiptTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+
Ta5d6ff"Tffea00\nTa5d6ffRound-trip time is Ta5d6ff"Tff7b72+Te6edf3rttstringTff7b72+
Ta5d6ff"Ta5d6ff over Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hopsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff hopTa5d6ff"Tff7b72+Te6edf3msTff7b72+
Te6edf3reception_statsTff7b72+Ta5d6ff"Tffea00\nTa5d6ff"
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffProbe timed outTa5d6ff"Tb4b4b4)
Te6edf3probes Tff7b72-Tff7b72= T79c0ff1
Te6edf3loss Tff7b72= Tffa657roundTb4b4b4(Tb4b4b4(T79c0ff1Tff7b72-Tb4b4b4(Te6edf3repliesTff7b72/Te6edf3sentTb4b4b4)Tb4b4b4)Tff7b72*T79c0ff100Tb4b4b4, T79c0ff2Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSent Tffd700{Te6edf3sentTffd700}Ta5d6ff, received Tffd700{Te6edf3repliesTffd700}Ta5d6ff, packet loss Tffd700{Te6edf3lossTffd700}Ta5d6ff%Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3loss Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3exitTb4b4b4(T79c0ff2Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffReticulum Probe UtilityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--configTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative Reticulum config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-sTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--sizeTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffsize of probe packet payload in bytesTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657intTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-nTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--probesTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff1Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffnumber of probes to sendTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657intTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-tTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--timeoutTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffsecondsTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fftimeout before giving upTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657floatTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-wTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--waitTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffsecondsTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fftime between each probeTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657floatTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--versionTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4, Te6edf3versionTff7b72=Ta5d6ff"Ta5d6ffrnprobe Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6fffull_nameTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fffull destination name in dotted notationTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffhexadecimal hash of the destinationTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff-vTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff--verboseTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffcountTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4:
Te6edf3configarg Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfig
Tff7b72elseTb4b4b4:
Te6edf3configarg Tff7b72= Tff7b72None
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffdestination_hashTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffprint_helpTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3program_setupTb4b4b4(
Te6edf3configdir Tff7b72= Te6edf3configargTb4b4b4,
Te6edf3destination_hexhash Tff7b72= Te6edf3argsTff7b72.Td2a8ffdestination_hashTb4b4b4,
Te6edf3size Tff7b72= Te6edf3argsTff7b72.Td2a8ffsizeTb4b4b4,
Te6edf3full_name Tff7b72= Te6edf3argsTff7b72.Td2a8fffull_nameTb4b4b4,
Te6edf3verbosity Tff7b72= Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3probes Tff7b72= Te6edf3argsTff7b72.Td2a8ffprobesTb4b4b4,
Te6edf3wait Tff7b72= Te6edf3argsTff7b72.Td2a8ffwaitTb4b4b4,
Te6edf3timeout Tff7b72= Te6edf3argsTff7b72.Td2a8fftimeoutTb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149KeyboardInterruptTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────